package br.com.crednove.controle;

import br.com.crednove.dao.DAOCliente;
import br.com.crednove.modelo.Cliente;
import br.com.crednove.paineis.PainelExportar;
import java.awt.ComponentOrientation;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.SQLException;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;

public class ControleExportar {
    
    private PainelExportar painel;
    private final String EXTENSAO_EXPORTACAO = ".csv";
    private final String JFILECHOOSER_FILTRO_DESCRICAO = "Arquivos do Excel 97-2003 (.csv)";
    private final String JFILECHOOSER_TITULO = "Salvar";
    private DAOCliente daoCliente;
    private boolean novo;
    private String cabecalhoExportacao = "BENEFICIO;CPF;NOME;DATA_NASCIMENTO;UF;ESPECIE;STATUS;OK\n";
    
    public ControleExportar(PainelExportar painel) {
        this.painel = painel;
        this.daoCliente = new DAOCliente();
        this.novo = false;
    }
    
    public void selecionarEvento() {
        String caminho = this.selecionarDiretorio();
        this.painel.getTxtArquivo().setText(caminho + EXTENSAO_EXPORTACAO);
        if (caminho != null) {
            this.painel.getBtnConfirmar().setEnabled(true);
        } else {
            this.painel.getBtnConfirmar().setEnabled(false);
        }
    }
    
    public void confirmarEvento() {
        if (this.novo) {
            this.resetar();
        } else {
            this.travarInterface(true);
            this.exportarClientes();
            this.novo = true;
        }
    }
    
    public void fecharEvento(ControleInicio giControle) {
        this.resetar();
        giControle.mostraPainel(ControleInicio.painelHome);
    }
    
    private String selecionarDiretorio() {
        JFileChooser seletorArquivo = new JFileChooser();
        seletorArquivo.setFileSelectionMode(JFileChooser.FILES_ONLY);
        seletorArquivo.setDialogTitle(JFILECHOOSER_TITULO);
        seletorArquivo.setFileFilter(new FileFilter() {
            @Override
            public boolean accept(File file) {
                return file.getName().toLowerCase().endsWith(EXTENSAO_EXPORTACAO) || file.isDirectory();
            }
            
            @Override
            public String getDescription() {
                return JFILECHOOSER_FILTRO_DESCRICAO;
            }
        });
        
        int i = seletorArquivo.showSaveDialog(null);
        if (i == 1) {
            return null;
        } else {
            return seletorArquivo.getSelectedFile().getAbsolutePath();
        }
    }
    
    private void carregarParametrosIniciais() {
        this.painel.getJpbProgresso().setValue(0);
        this.painel.getJspMesNasc().setValue(1);
        this.painel.getJspAnoNasc().setValue(1950);
        this.painel.getJspDiaNasc().setValue(1);
        this.painel.getJspMesPag().setValue(1);
        this.painel.getJspAnoPag().setValue(2010);
        this.painel.getJspMinCEP().setValue(0);
        this.painel.getJspMinCEP().setValue(99999999);
        this.painel.getJcbNaoExportados().setSelected(false);
        this.painel.getTxtArquivo().setText("");
    }
    
    private String geraSQL() {
        String diaNasc = String.valueOf(this.painel.getJspDiaNasc().getValue());
        String mesNasc = String.valueOf(this.painel.getJspMesNasc().getValue());
        String anoNasc = String.valueOf(this.painel.getJspAnoNasc().getValue());
        
        String mesPag = String.valueOf(this.painel.getJspMesPag().getValue());
        String anoPag = String.valueOf(this.painel.getJspAnoPag().getValue());
        
        String minCEP = this.painel.getJspMinCEP().getValue().toString();
        String maxCEP = this.painel.getJspMaxCEP().getValue().toString();

        //Ajusta os valores passados como parametros para busca
        while (diaNasc.length() < 2) {
            diaNasc = "0" + diaNasc;
        }
        while (mesNasc.length() < 2) {
            mesNasc = "0" + mesNasc;
        }
        
        while (mesPag.length() < 2) {
            mesPag = "0" + mesPag;
        }
        
        while (anoPag.length() < 2) {
            anoPag = "0" + anoPag;
        }
        
        String dataNasc = anoNasc + mesNasc + diaNasc;
        String inicioPag = anoPag + mesPag + "01";
        //inicia construção de sql
        String sql = "select * from cliente where clie_dataNasc>'" + dataNasc + "' "
                + "and clie_inicioPag='" + inicioPag + "' and clie_cep between " + minCEP + " and " + maxCEP
                + " and clie_trabalhado=false ";
        
        if (this.painel.getJcbNaoExportados().isSelected()) {
            sql = sql + " and clie_exportado=false;";
        }
        return sql;
    }
    
    private void exportarClientes() {
        new Thread() {
            @Override
            public void run() {
                try {
                    daoCliente.conectar();
                    if (daoCliente.executaSQL(geraSQL())) {
                        if (daoCliente.getNumRegistros() != 0) {
                            FileWriter arquivo = new FileWriter(painel.getTxtArquivo().getText());
                            BufferedWriter bfwEscritor = new BufferedWriter(arquivo);
                            escreverCSV(cabecalhoExportacao, bfwEscritor);
                            painel.getJpbProgresso().setMinimum(0);
                            painel.getJpbProgresso().setMaximum(daoCliente.getNumRegistros());
                            
                            for (int i = 1; daoCliente.getRs().next(); i++) {
                                Cliente cl = daoCliente.importarCliente();
                                escreverCSV(cl.toString() + "\n", bfwEscritor);
                                daoCliente.atualizaExportado(cl.getCpf(), true);
                                painel.getJpbProgresso().setValue(i);
                                painel.getLblStatus().setText(i + " / " + daoCliente.getNumRegistros());
                            }
                            bfwEscritor.close();
                            JOptionPane.showMessageDialog(null, "Clientes exportados com sucesso");
                        } else {
                            JOptionPane.showMessageDialog(null, "Nenhum cliente encontrado com os parametros informados");
                        }
                    } else {
                        JOptionPane.showMessageDialog(null, "Erro ao consultar dados");
                    }
                    daoCliente.desconectar();
                } catch (SQLException ex) {
                    System.out.println(ex);
                    JOptionPane.showMessageDialog(null, "Erro ao exportar");
                } catch (IOException ex) {
                    System.out.println(ex);
                    JOptionPane.showMessageDialog(null, "Erro ao exportar");
                }
                painel.getBtnConfirmar().setEnabled(true);
                painel.getBtnConfirmar().setText("Novo");
            }
        }.start();
    }
    
    private void resetar() {
        this.painel.getBtnConfirmar().setText("Confirmar");
        this.painel.getLblStatus().setText("...");
        this.travarInterface(false);
        this.painel.getBtnConfirmar().setEnabled(false);
        this.carregarParametrosIniciais();
        this.novo = false;
    }
    
    private void travarInterface(boolean cond) {
        this.painel.getBtnConfirmar().setEnabled(!cond);
        this.painel.getBtnSelecionar().setEnabled(!cond);
        this.painel.getJspAnoNasc().setEnabled(!cond);
        this.painel.getJspMesNasc().setEnabled(!cond);
        this.painel.getJspDiaNasc().setEnabled(!cond);
        this.painel.getJspMesPag().setEnabled(!cond);
        this.painel.getJspAnoPag().setEnabled(!cond);
        this.painel.getJspMinCEP().setEnabled(!cond);
        this.painel.getJspMaxCEP().setEnabled(!cond);
    }
    
    private boolean escreverCSV(String conteudo, BufferedWriter writer) {
        try {
            writer.write(conteudo);
            writer.flush();
            return true;
        } catch (IOException ex) {
            System.out.println(ex + "erro ao escrever cpf na planilha");
            return false;
        }
    }
}
